草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - 为所有异常使用一个基类有什么缺点?

我正在做Stroustrup的C++编程语言第4版中的练习。其中一项任务是这样制定的:ConsiderusingaclassExceptionasthebaseofallclassesusedasexceptions.Whatshoulditlooklike?Howshoulditbeused?Whatgoodmightitdo?Whatdisadvantagesmightresultfromarequirementtousesuchaclass?答案看起来很像std::exception,除了缺点部分-我唯一能想到的是__vptr的成本,这通常被认为可以忽略不计.我在这里缺少什么?

c++ - 在 C++11 中,您能否将引用的基类传递给线程的构造函数并获得多态行为?

我观察到VisualStudio11Beta中的新库与使用thread()和ref()的Boost之间的行为差​​异。我想知道谁是对的。如果标准偏离了Boost的原始实现,则两者都可能。(但我不打算尝试破译标准语......)我会用MinGW试一试......唉,据我所知,不适用于MinGW。那么,第一个问题是,gcc和Clang是否表现出相同的编译失败?如果他们不这样做,我将针对VS提交错误。第二个问题可能是,如果编译失败是正确的,我的解决方法是什么来获得Boost给我的东西(除了继续使用Boost)?我想我确实有第三个问题...我正在做的事情是否符合犹太洁食标准?classbase

c++ - 没有对多个基类中的模板化成员函数进行访问或歧义检查

这可以在VisualC++2015Update3RC上正常编译和运行:classA{templatevoidf(){}};classB:A{};classC:A{};classD:B,C{};intmain(){Dd;d.f();}这段代码有两个问题:f()是私有(private)的,所以d.f()应该无法编译。f()是模棱两可的,因为它可能是B::f()或C::f().但是,/Wall没有诊断功能和B::f()叫做。倒序D继承自getsC::f()调用,所以我猜它只是使用列表中的第一个基类。g++和clang都正确。我是否遗漏了什么或者这是VisualC++中的错误?

c++ - 继承二级基类构造函数: silent error

我今天遇到了一个非常严重的错误,这是一个MWE:#includeclassX{public:X(){std::cout与我的预期相反,打印了“Default”。不可否认,代码是错误的,因为Z的继承构造函数试图初始化X而没有指定如何构造Y(∗).但是,编译器不应该提示吗?Y(以及随后的X)的默认构造函数被调用,完全无提示地忽略我的参数3背后的基本原理是什么?这是否记录在标准的某处?还是我的编译器存在错误?我的环境是gccversion6.2.120160916(RedHat6.2.1-2)。即使使用-Weffc++-Wall-Wextra-pedantic也不会产生编译器警告。

c++ - 从指向派生对象的基类指针访问派生私有(private)成员函数

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Whycaniaccessaderivedprivatememberfunctionviaabaseclasspointertoaderivedobject?#includeusingnamespacestd;classB{public:virtualvoidfn1(void){coutfn1();p->fn2();}为什么p->fn2()调用派生类函数,即使fn2在D中是私有(private)的?

c++ - 确保抽象基类是一个 shared_ptr

我有一个抽象基类:structBase:std::enable_shared_from_this{virtual~Base()=default;virtualvoidfoo()=0;voidbar(){baz(shared_from_this());}};Base的唯一有效用例是存在于shared_ptr中-bar是一个重要的方法。我怎样才能确保以下情况是不可能的:structBadDerived:Base{voidfoo()override{...}};BadDerivedbd;bd.bar(); 最佳答案 一种技术是将Base的

c++ - 通过基类函数指针调用派生类

我能否通过基类函数指针调用派生类,如下例所示?我知道我的示例有效,但它是否保证始终如此(假设对象实际实现了该功能!),或者这只是我正在使用的编译器的特性?按照这种逻辑,难道不能简单地从“CBase”(在本例中是空的,所以我猜没有开销)派生所有类并忽略函数指针中的类型吗?#includestructCBase{};structCDerived:CBase{voidMyFunction(){std::cout(&CDerived::MyFunction);(base->*pointer)();deletebase;}示例使用场景:一种派生类,它采用一个或多个指向基类中“回调”的指针。是否可

c++ - 通过模板类的基类进行参数相关查找

我有一个模板类NB::B派生自非模板类NA::A在命名空间中。act是调用add_ref的模板函数在其模板参数的实例上运行。具体来说,act>想找add_ref在NB::B的命名空间中定义使用ADL的基础。完整示例如下:templatevoidact(){T*p=0;add_ref(p);//thefailingline}namespaceNA{structA{};//IwantADLtofindthis:voidadd_ref(A*p){}}namespaceNB{//templateclasswithnon-templatebasetemplatestructB:NA::A{};t

c++ - 从基类的静态模板方法中调用继承类的 protected 构造函数失败

我有一个组件类,它定义了一般情况下应该如何创建Component的静态模板方法:classComponent{protected:uint32_tid;Component(uint32_tid):id(id){}templatestaticT*createComponent(){//contentherenotrelevantreturnnewT(someParameter);}};然后是一个实现,例如一个Button。这个类的构造函数不能直接使用,而是有一个调用Component::createComponent模板函数的静态方法。classButton:publicComponen

c++ - 为什么将子指针向上转换为基类有时会更改指针值?

我发现了其他一些似乎与我的问题有关的问题,但没有一个直接回答它(即使是theone几乎同名)。我有一个从两个父类派生的C++子类。我创建了该类的一个对象,然后将其引用转换到它的两个父类中的每一个。强制转换值不相同,但其中一个仍然是子引用的值。这是代码:classMom{public:inta=1;};classDad{public:intb=2;};classChild:publicMom,publicDad{public:intc=3;};intmain(){Child*c=newChild;//0x00C5A618Mom*m=c;//0x00C5A618Dad*d=c;//0x00